package com.dify.tool.common.utils;

import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import io.minio.messages.Bucket;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.List;

/**
 * @author shl
 * @date 2025-06-03
 * @description minio工具类
 */
@Data
@Component
public class MinioUtil {

    private final MinioClient minioClient;

    private final String bucket;

//    @Value("${minio.endpoint}")
//    private String endpoint;
//
//    @Value("${minio.access-key}")
//    private String accessKey;
//
//    @Value("${minio.secret-key}")
//    private String secretKey;
//
//    @Value("${minio.bucket-name}")
//    private String bucket;

    /**
     * 初始化MinIO客户端
     */
    public MinioUtil(@Value("${minio.endpoint}") String endpoint,
                     @Value("${minio.access-key}") String accessKey,
                     @Value("${minio.secret-key}") String secretKey,
                     @Value("${minio.bucket-name}") String bucket) throws InvalidPortException, InvalidEndpointException {
        this.minioClient = new MinioClient(endpoint, accessKey, secretKey);
        this.bucket = bucket;
        this.minioClient.setTimeout(30 * 1000, 30 * 1000, 30 * 1000);
    }

    // ------------------------ 存储桶操作 ------------------------

    /**
     * 检查存储桶是否存在
     */
    public boolean bucketExists(String bucketName) throws Exception {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 创建存储桶
     */
    public void createBucket(String bucketName) throws Exception {
        if (!bucketExists(bucketName)) {
            minioClient.makeBucket(bucketName);
        }
    }

    /**
     * 列出所有存储桶
     */
    public List<Bucket> listBuckets() throws Exception {
        return minioClient.listBuckets();
    }

    // ------------------------ 文件操作 ------------------------

    /**
     * 上传文件到默认存储桶
     *
     * @param inputStream 文件流
     * @param objectName  对象路径（如 "images/avatar.jpg"）
     * @param contentType MIME类型（如 "image/jpeg"）
     */
    public void uploadFile(InputStream inputStream, String objectName, String contentType) throws Exception {
        uploadFile(bucket, objectName, inputStream, contentType);
    }

    /**
     * 上传文件并返回预览地址
     *
     * @param inputStream 文件流
     * @param objectName  对象路径（如 "images/avatar.jpg"）
     * @param contentType MIME类型（如 "image/jpeg"）
     */
    public String uploadFileAndGetObject(InputStream inputStream, String objectName, String contentType) throws Exception {
        uploadFile(bucket, objectName, inputStream, contentType);
        return getPreviewUrl(objectName);
    }

    /**
     * 上传文件到指定存储桶
     */
    public void uploadFile(String bucketName, String objectName, InputStream inputStream, String contentType)
            throws Exception {
        // 自动创建存储桶
        createBucket(bucketName);
        minioClient.putObject(bucketName, objectName, inputStream, contentType);
    }

    /**
     * 下载文件
     *
     * @param bucketName 存储桶名称
     * @param objectName 对象路径
     * @return 文件流
     */
    public InputStream downloadFile(String bucketName, String objectName) throws Exception {
        return minioClient.getObject(bucketName, objectName);
    }

    // ------------------------ 预览链接 ------------------------

    /**
     * 生成文件预览URL（默认7天有效期）
     */
    public String getPreviewUrl(String objectName) throws Exception {
        return getPreviewUrl(bucket, objectName, 7);
    }

    /**
     * 生成文件预览URL（自定义有效期）
     *
     * @param expiryDays 链接有效期（天）
     */
    public String getPreviewUrl(String bucketName, String objectName, int expiryDays) throws Exception {
        return minioClient.presignedGetObject(bucketName, objectName, expiryDays * 24 * 60 * 60);
    }
}
